
package ThreadingSafety;

import java.util.Scanner;

/**
 * Date: 2022-09-12 9月8 02:30:00时的课程内容:
 * Time: 13:54
 *
 *  内存可见性问题:
 */
public class TestDemo15 {   //
    static class Counter {  //
         public volatile int count = 0; //
        //public int count = 0; //

    }//
    public static void main(String[] args) {//
        Counter counter = new Counter();//

        Thread t1 = new Thread(() -> {//
            while(counter.count == 0) {  //counter.count == 0 读内存(LOAD),进行比较(CMP).
                                         // LOAD 比 CMP 慢太多了. (3-4个数量级, 1w倍 )..
//                System.out.println("hello");  //
//                try {  //
//                    Thread.sleep(1000);   //
//                } catch (InterruptedException e) {    //
//                    e.printStackTrace();  //
//                } //

            }//
            System.out.println("线程t1执行完毕");//
        });//
        t1.start();//

        Thread t2 = new Thread(() -> {//
            System.out.println("请输入一个整数: ");//
            Scanner scanner = new Scanner(System.in);//
            counter.count = scanner.nextInt();  // 线程t2 去修改 count 的值.//
            System.out.println("线程t2执行完毕");//
        });//
        t2.start();//
    }//
}
// 为了解决内存可见性问题, 有了 volatile关键字.
// 被volatile关键字 修饰的变量 就不会触发 "不读内存,只读寄存器" 的优化.
// volatile 关键字 不能保证原子性!! 具体代码看 TestDemo16.

